use std::collections::HashMap;

fn main() {
    // 创建和插入数据
    let mut scores = HashMap::new();
    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yello"), 50);
    println!("Hello, world!");

    // vector到hashmap的转换，使用collect， 注意类型的自动推导
    let teams = vec![String::from("Blue"), String::from("Yellow")];
    let initial_scores = vec![10, 50];
    let mut scores: HashMap<_, _> =
        teams.into_iter().zip(initial_scores.into_iter()).collect();
    
    // 数据读取
    let team_name = String::from("blue");
    let score = scores.get(&team_name);
    match score {
        Some(x) => {
            println!("team {} got {} scores", team_name, x);
        },
        None => (),
    }

    for (key, value) in &scores {
        println!("{}: {}", key, value);
    }
    // 数据更新
    scores.insert(String::from("Blue"), 25);    // 覆盖模式
    println!("override: {:?}", scores);

    scores.entry(String::from("Yellow")).or_insert(100);    // 不存在时才插入
    scores.entry(String::from("Red")).or_insert(50);
    println!("or_insert: {:?}", scores);

    // 根据旧值更新
    let text = "hello world wonderful world";
    let mut map = HashMap::new();
    for word in text.split_whitespace() {
        let count = map.entry(word).or_insert(0);
        // or_insert 方法返回这个键的值的一个可变引用（&mut V）。这里我们将这个可变引用储存在 count 变量中，所以为了赋值必须首先使用星号（*）解引用 count
        *count += 1;
    }
    println!("or_insert: {:?}", map);
}
